package com.ld.config;

import com.ld.realm.StaffToken;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
import org.apache.shiro.realm.Realm;

import java.util.ArrayList;
import java.util.Collection;

public class UserModularRealmAuthenticator extends ModularRealmAuthenticator {

    @Override
    protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException {
        //是否配置了realm
        assertRealmsConfigured();
        //获取所有的realm
        Collection<Realm> realms = getRealms();
        //自定义一个集合存放符合要求的realm
        Collection<Realm> realmsType = new ArrayList<>();
        //强转为自定义的token(可以存状态 会员或员工)
        StaffToken staffToken =(StaffToken)authenticationToken;

        for (Realm realm : realms) {
            //getName获取realm的名字,如CustomerRealm或StaffRealm,并转为大写。
            // 如果包含token带过来的则放入自定义的集合(token带过来的只会是customer或staff,故用contains,
            // 且都转为大写方便比较。所以Realm的命名必须带有Customer或Staff标识)
            if (realm.getName().toUpperCase().contains(staffToken.getRoleType().toUpperCase())){
                realmsType.add(realm);
            }
        }
        //如果只有一个realm则直接执行(注：这里的集合和token都换成自定义的,和源码不同)
        if (realmsType.size() == 1) {
            return doSingleRealmAuthentication(realmsType.iterator().next(), staffToken);
        } else {
            return doMultiRealmAuthentication(realmsType, staffToken);
        }
    }
}
